package servicios;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import negocio.CasaCentral;
import negocio.CondicionDePago;

import utiles.Converters;

import dao.annotations.DAOCasaCentral;
import dao.annotations.DAOCondicionDePago;
import dao.interfaces.IDAOCasaCentral;
import dao.interfaces.IDAOCondicionDePago;
import dto.DTOCondicionDePago;
import dto.DTOConfiguracion;
import excepciones.Excepcion;
import filtros.FiltroCondicionDePago;

import interfaces.IServicioAplicacion;

public class ServicioAplicacion extends Servicio implements IServicioAplicacion
{
	private static final long serialVersionUID = -6503859588960117136L;
	private IDAOCondicionDePago daoCondicionDePago;
	private IDAOCasaCentral daoCasaCentral;
	
	public ServicioAplicacion() throws RemoteException {
		super();
		daoCondicionDePago = new DAOCondicionDePago();
		daoCasaCentral = new DAOCasaCentral();
	}

	@Override
	public List<DTOCondicionDePago> listarCondicionesDePago() throws RemoteException
	{
		try
		{	
			daoCondicionDePago.openSession();
			List<DTOCondicionDePago> data = new ArrayList<DTOCondicionDePago>();
			FiltroCondicionDePago filtro = new FiltroCondicionDePago();
			for (CondicionDePago item : daoCondicionDePago.listar(filtro)) {
				data.add(Converters.convertToDTO(item));
			}
			return data;
		}
		catch (Exception e)
		{
			throw new Excepcion(e.getMessage());
		}
		finally
		{
			daoCondicionDePago.closeSession();
		}
	}

	@Override
	public DTOCondicionDePago obtenerCondicionDePago(Integer codigo) throws RemoteException
	{
		try
		{
			daoCondicionDePago.openSession();
			return Converters.convertToDTO(daoCondicionDePago.obtener(codigo));
		}
		catch (Exception e)
		{
			throw new Excepcion(e.getMessage());
		}
		finally
		{
			daoCondicionDePago.closeSession();
		}
	}

	@Override
	public void modificarConfiguracion(Float porcentajeDeGanancia, Integer pedidoVigenciaDias) throws RemoteException
	{
		try
		{
			daoCasaCentral.openSession();
			daoCasaCentral.beginTransaction();
			CasaCentral entidad = daoCasaCentral.obtener(codigoCasaCentral);
			entidad.setPedidoVigenciaDias(pedidoVigenciaDias);
			entidad.setPorcentajeDeGanancia(porcentajeDeGanancia);
			daoCasaCentral.grabar(entidad);
			daoCasaCentral.comitTransaction();
		}
		catch (Exception e)
		{
			daoCasaCentral.rollbackTransaction();
			throw new Excepcion(e.getMessage());
		}
		finally
		{
			daoCasaCentral.closeSession();
		}	
	}

	@Override
	public DTOConfiguracion obtenerConfiguracion() throws RemoteException
	{
		try
		{
			daoCasaCentral.openSession();
			CasaCentral entidad = daoCasaCentral.obtener(codigoCasaCentral);
			DTOConfiguracion dto = new DTOConfiguracion(entidad.getPorcentajeDeGanancia(), entidad.getPedidoVigenciaDias());
			return dto;
		}
		catch (Exception e)
		{
			throw new Excepcion(e.getMessage());
		}
		finally
		{
			daoCasaCentral.closeSession();
		}
	}

}
